Main Analysis

Data Background Information

Treatment Averaged Data

Data Headers and Sample Records
Sample_Number Sedum.rubro Sedum.acre bare.substrate rubro.vs.acre rubro.vs.substrate acre.vs.substrate hour timestamp day
1 23.00 25.17 25.50 -2.17 -2.50 -0.33 14 2019-03-04 14:18:00 2019-03-04
2 24.17 23.33 25.00 0.83 -0.83 -1.67 14 2019-03-04 14:48:00 2019-03-04
3 24.83 23.50 25.00 1.33 -0.17 -1.50 15 2019-03-04 15:18:00 2019-03-04
4 24.50 23.33 24.83 1.17 -0.33 -1.50 15 2019-03-04 15:48:00 2019-03-04
5 22.67 21.50 22.83 1.17 -0.17 -1.33 16 2019-03-04 16:18:00 2019-03-04
6 20.33 18.83 20.00 1.50 0.33 -1.17 16 2019-03-04 16:48:00 2019-03-04

All Cells Data

Data Headers and Sample Records
Sample Temp Location Cell TimeStamp Ambient Treatment
1 20.178 exterior 1 2019-04-03T21:18:00Z 15.55556 sedum rubrotinctum
2 19.177 exterior 1 2019-04-03T21:48:00Z 15.00000 sedum rubrotinctum
3 18.676 exterior 1 2019-04-03T22:18:00Z 15.00000 sedum rubrotinctum
4 17.675 exterior 1 2019-04-03T22:48:00Z 14.44444 sedum rubrotinctum
5 15.672 exterior 1 2019-04-03T23:18:00Z 14.44444 sedum rubrotinctum
6 15.672 exterior 1 2019-04-03T23:48:00Z 13.88889 sedum rubrotinctum

Comparison of Treatment Avg at Samples

Table: Summary Statistics
comparison mean(difference) max(difference) sd(difference)
rubro vs substrate -0.0022381 5.5 0.5922385
acre vs substrate -0.4685714 4.0 0.8531867

Temperature Differences by Hour

Table: Difference Score Counts for Sedum rubrotinctum
counts rubro - substrate Percent (%) rubro
negative/colder 615 36.607
positive/hotter 507 30.179
zero/same 558 33.214

Table: Difference Score Counts for Sedum acre
counts acre - substrate Percent (%) acre
negative/colder 1355 80.650
positive/hotter 181 10.770
zero/same 144 8.571

Comparison of Temperatures by Hour

Daily Max and Daily Range

Diurnal Temperature Ranges (DTR)

Table: Summary of Mean DTR for Each Treatment
mean(rubro_range) mean(acre_range) mean(soil_range)
17.52583 16.65222 18.02583

Daily Max Temperatures

Table: Summary of Maximum Temperature by Treatment
Category rubro_max acre_max
Lower Max (vs Soil) 34.00000 33.00000
Higher Max (vs Soil) 1.00000 2.00000
Same Max (vs Soil) 1.00000 1.00000
Average Max Temperature 29.12417 27.95778
Maximum Max Temperature 38.00000 36.33000

Linear Models for Treatment vs Control

Linear Model Summary Statistics: soil ~ Sedum rubrotinctum
term estimate std.error statistic p.value
(Intercept) -0.2214027 0.0396301 -5.586738 0
Sedum.rubro 1.0120918 0.0019980 506.562001 0

Linear Model Summary Statistics: soil ~ Sedum acre
term estimate std.error statistic p.value
(Intercept) -0.6476698 0.0512635 -12.63413 0
Sedum.acre 1.0619192 0.0026596 399.27407 0

Linear Model Summary Statistics
term estimate std.error statistic p.value
(Intercept) 18.496311 0.1727703 107.057250 0
rubro.vs.substrate -2.765121 0.2918090 -9.475793 0

Linear Model Summary Statistics
term estimate std.error statistic p.value
(Intercept) 16.185584 0.1647357 98.25184 0
acre.vs.substrate -4.944637 0.1692780 -29.21016 0

When Ambient > 25 degrees C (Interior T)

Table: Summary of High (>25) Ambient Temperatures
Treatment count max min range mean median sd
bare substrate 132 39.5 15.5 24.0 26.44697 28.25 8.952218
sedum acre 132 37.5 15.5 22.0 25.76515 28.75 8.362366
sedum rubrotinctum 132 39.0 15.5 23.5 26.45455 29.25 8.780499

Normality Tests

## 
##  Shapiro-Wilk normality test
## 
## data:  treat_avg$Sedum.rubro
## W = 0.92072, p-value < 2.2e-16

## 
##  Shapiro-Wilk normality test
## 
## data:  treat_avg$Sedum.acre
## W = 0.92854, p-value < 2.2e-16

Data Transformations

Sedum rubrotinctum Transformations

Table: Skewness + Kurtosis
Transformation Type Skewness Kurtosis
No Transformation 0.7340 -0.514
Square Root 0.4770 -0.824
Cube Root 0.3880 -0.887
Log 0.2020 -0.947
Tukey’s Ladder of Powers -0.0796 -0.863
Box-Cox 0.0340 -0.921

Sedum acre Transformations

Table: Skewness + Kurtosis
Transformation Type Skewness Kurtosis
No Transformation 0.69600 -0.532
Square Root 0.43500 -0.836
Cube Root 0.34500 -0.895
Log 0.16000 -0.945
Tukey’s Ladder of Powers -0.07550 -0.874
Box-Cox -0.00815 -0.909

Appendix - Code

#setup and cleaning data

library("ggplot2")
library("ggpubr")
library("tidyverse")
library("tidyr")
library("dygraphs")
library("dplyr")
library("scales")
library("MASS")
library("viridis")
library("DT")
library("rcompanion")
library("car")
library("e1071") 
library("visdat")

setwd("/Users/edenaxelrad/Desktop/Green Roofs (Thesis)/Run 1 CSV Files")

all_cells <- read.csv("all_cells.csv")

timestamps <- read.csv("sample time-stamps.csv")
timestamps <- timestamps[1:1680,]
timestamps$TimeStamp <- as.POSIXct(timestamps$TimeStamp, format = "%m/%d/%y %H:%M:%S")
timestamps$Time <- format(as.POSIXct(timestamps$TimeStamp,"%m/%d/%y %H:%M:%S"),'%H')
timestamps$Date <- as.Date(timestamps$Date, format = "%m/%d/%y")

treat_avg <- read.csv("treat avg comp.csv", stringsAsFactors = FALSE)
treat_avg <- treat_avg[-1681,]

treat_avg$hour <- timestamps$Time
treat_avg$timestamp <- timestamps$TimeStamp
treat_avg$day <- as.Date(timestamps$Date)

#addressing missing values due to time change
treat_avg[265,8] <- "02"
treat_avg[266,8] <- "02"
treat_avg[265,9] <- "2019-03-10 02:18:00"
treat_avg[266,9] <- "2019-03-10 02:48:00"
#Background information for treatment averaged data

head <- head(treat_avg)
knitr::kable(head, caption = "Data Headers and Sample Records")

vis_dat(treat_avg)

ggplot(treat_avg) + theme_void()
#Background information for all cells data

head <- head(all_cells)
knitr::kable(head, caption = "Data Headers and Sample Records")

vis_dat(all_cells)

# Comparison of Treatment Avg at Samples

rubro <- cbind(treat_avg$rubro.vs.substrate, "rubro vs substrate")
colnames(rubro) <- c("difference", "comparison")

acre <- cbind(treat_avg$acre.vs.substrate, "acre vs substrate")
colnames(acre) <- c("difference", "comparison")

plot(treat_avg$Sample_Number, treat_avg$rubro.vs.substrate, type = "l",
     main = "sedum rubrotinctum - bare substrate",
     xlab = "sample number",
     ylab = "temperature difference (C)")
abline(h=0, col="blue")
abline(h=mean(treat_avg$rubro.vs.substrate), col="red", lty = 2)

plot(treat_avg$Sample_Number, treat_avg$acre.vs.substrate, type = "l",
     main = "sedum acre - bare substrate",
     xlab = "sample number",
     ylab = "temperature difference (C)")
abline(h=0, col="blue")
abline(h=mean(treat_avg$acre.vs.substrate), col="red", lty = 2)

long_data <- rbind.data.frame(rubro, acre)

long_data$difference <- as.numeric(as.character(long_data$difference))
long_data$abs_diff <- lapply(long_data$difference, abs)

summ_stats <-
  long_data %>%
  group_by(comparison) %>%
  summarize(mean(difference), max(difference), sd(difference))

knitr::kable(summ_stats, caption = "Table: Summary Statistics")
# Temperature Differences by Hour

neg_counts <- c("negative/colder", sum(treat_avg$rubro.vs.substrate<0), sum(treat_avg$acre.vs.substrate<0))
pos_counts <- c("positive/hotter", sum(treat_avg$rubro.vs.substrate>0), sum(treat_avg$acre.vs.substrate>0))
zero_counts <- c("zero/same", sum(treat_avg$rubro.vs.substrate==0), sum(treat_avg$acre.vs.substrate==0))

diff_counts <- rbind.data.frame(neg_counts, pos_counts, zero_counts)
colnames(diff_counts) <- c("counts", "rubro - substrate", "acre - substrate")

diff_counts$`rubro - substrate` <- as.numeric(as.character(diff_counts$`rubro - substrate`))
diff_counts$`acre - substrate` <- as.numeric(as.character(diff_counts$`acre - substrate`))

diff_counts <- 
  diff_counts %>%
  mutate("Percent (%) rubro" = signif(100*(`rubro - substrate`/1680), digits=5)) %>%
  mutate("Percent (%) acre" = signif(100*(`acre - substrate`/1680), digits=4))

diff_countsR <- diff_counts[,c(1,2,4)]
diff_countsA <- diff_counts[,c(1,3,5)]

get_density <- function(x, y, ...) {
  dens <- MASS::kde2d(x, y, ...)
  ix <- findInterval(x, dens$x)
  iy <- findInterval(y, dens$y)
  ii <- cbind(ix, iy)
  return(dens$z[ii])
}

treat_avg$hour  <- as.numeric(treat_avg$hour)

treat_avg$densityR <- get_density(treat_avg$hour, treat_avg$rubro.vs.substrate, n=40)
treat_avg$densityA <- get_density(treat_avg$hour, treat_avg$acre.vs.substrate, n=40)

ggplot(treat_avg) + geom_point(aes(treat_avg$hour, treat_avg$rubro.vs.substrate, size = treat_avg$densityR)) + scale_color_viridis() + ylim(-3.5,5.5) + ggtitle("Sedum rubrotinctum - Bare Substrate") + ylab("Temperature Difference") + xlab("Hour") + labs(size="Density") + geom_hline(yintercept=0, linetype="dashed", color = "red")

knitr::kable(diff_countsR, caption = "Table: Difference Score Counts for Sedum rubrotinctum")
ggplot(treat_avg) + theme_void()
ggplot(treat_avg) + geom_point(aes(treat_avg$hour, treat_avg$acre.vs.substrate, size = treat_avg$densityA)) + scale_color_viridis() + ylim(-3.5,5.5) + ggtitle("Sedum acre - Bare Substrate") + ylab("Temperature Difference") + xlab("Hour") + labs(size="Density") + geom_hline(yintercept=0, linetype="dashed", color = "red")

knitr::kable(diff_countsA, caption = "Table: Difference Score Counts for Sedum acre")
# Comparison of Temperatures by Hour

hrly_avg <-
  treat_avg %>%
  group_by(hour) %>%
  summarize(mean(Sedum.rubro), mean(Sedum.acre), mean(bare.substrate))

hrly_avg <- hrly_avg[1:24,]
hrly_avg$rubro_diff <- hrly_avg$`mean(Sedum.rubro)`- hrly_avg$`mean(bare.substrate)`
hrly_avg$acre_diff <- hrly_avg$`mean(Sedum.acre)`- hrly_avg$`mean(bare.substrate)`
hrly_avg$rubro_diff <- signif(hrly_avg$rubro_diff, digits = 6)
hrly_avg$acre_diff <- signif(hrly_avg$acre_diff, digits = 6)
hrly_avg$`mean(bare.substrate)` <- signif(hrly_avg$`mean(bare.substrate)`, digits = 6)
hrly_avg$`mean(Sedum.rubro)` <- signif(hrly_avg$`mean(Sedum.rubro)`, digits = 6)
hrly_avg$`mean(Sedum.acre)` <- signif(hrly_avg$`mean(Sedum.acre)`, digits = 6)

plot(hrly_avg$hour, hrly_avg$`mean(Sedum.acre)`, type = "l", col = "blue",
     main = "Hourly Temperature Averages",
     xlab = "hour",
     ylim = c(10,30),
     ylab = "avg temperature (C)")
lines(hrly_avg$hour, hrly_avg$`mean(bare.substrate)`, col="black")
lines(hrly_avg$hour, hrly_avg$`mean(Sedum.rubro)`, col="red")
legend("topleft", legend = c("substrate", "rubro", "acre"), col = c("black", "red", "blue"), lty=1:1, box.lty=0)

only_8am <- 
  treat_avg %>%
  filter(hour == "8" | hour == "08") %>%
  group_by(day) %>%
  summarize(mean(bare.substrate), mean(Sedum.rubro), mean(Sedum.acre))

plot(only_8am$day, only_8am$`mean(bare.substrate)`, type = "l", main = "Daily Temperatures at 8am", xlab = "", ylab = "Temperature (C)")
lines(only_8am$day, only_8am$`mean(Sedum.rubro)`, type = "l", col = "red")
lines(only_8am$day, only_8am$`mean(Sedum.acre)`, type = "l", col = "blue")
legend("topleft", legend = c("substrate", "rubro", "acre"), col = c("black", "red", "blue"), lty=1:1, box.lty=0)

only_daytime <- 
  treat_avg %>%
  filter(hour > "10") %>%
  filter(hour < "17") %>%
  group_by(day) %>%
  summarize(mean(bare.substrate), mean(Sedum.rubro), mean(Sedum.acre))

plot(only_daytime$day, only_daytime$`mean(bare.substrate)`, type = "l", main = "Daily Temperatures from 11am to 4pm", xlab = "", ylab = "Temperature (C)")
lines(only_daytime$day, only_daytime$`mean(Sedum.rubro)`, type = "l", col = "red")
lines(only_daytime$day, only_daytime$`mean(Sedum.acre)`, type = "l", col = "blue")
legend("topleft", legend = c("substrate", "rubro", "acre"), col = c("black", "red", "blue"), lty=1:1, box.lty=0)

datatable(hrly_avg, class = 'cell-border stripe', options = list(pageLength = 24))
# Diurnal Temperature Ranges (DTR) 

daily_range <- 
  treat_avg %>%
  group_by(day) %>%
  summarize(max(Sedum.rubro), min(Sedum.rubro), max(Sedum.acre), min(Sedum.acre), max(bare.substrate), min(bare.substrate))

daily_range <-
  daily_range %>%
  mutate(rubro_range = `max(Sedum.rubro)` - `min(Sedum.rubro)`) %>%
  mutate(acre_range = `max(Sedum.acre)` - `min(Sedum.acre)`) %>%
  mutate(soil_range = `max(bare.substrate)` - `min(bare.substrate)`) 

plot(daily_range$day, daily_range$rubro_range, type = "l", col = "red",
     main = "Daily Temperature Ranges (Interior Sensors)",
     xlab = "",
     ylab = "Temperature Range (C)")
lines(daily_range$day, daily_range$acre_range, col="blue", lty = 1)
lines(daily_range$day, daily_range$soil_range, col="black", lty = 1)
legend("bottom", legend = c("substrate", "rubro", "acre"), col = c("black", "red", "blue"), lty=1:1, box.lty=0)

DTR_summ <-
  daily_range %>%
  summarize(mean(rubro_range), mean(acre_range), mean(soil_range))

knitr::kable(DTR_summ, caption = "Table: Summary of Mean DTR for Each Treatment")


Count_types <- c("Smaller DTR", "Larger DTR", "Same DTR")
Rdtr_counts <- rbind(sum((daily_range$rubro_range - daily_range$soil_range) < 0), sum((daily_range$rubro_range - daily_range$soil_range) > 0), sum((daily_range$rubro_range - daily_range$soil_range) == 0))

Adtr_counts <- rbind(sum((daily_range$acre_range - daily_range$soil_range) < 0), sum((daily_range$acre_range - daily_range$soil_range) > 0), sum((daily_range$acre_range - daily_range$soil_range) == 0))

DTR_counts <- cbind.data.frame(Count_types, Rdtr_counts, Adtr_counts)
ggplot(treat_avg) + theme_void()
# Daily Max Temperatures 

plot(daily_range$day, daily_range$`max(Sedum.rubro)`, type = "l", col = "red",
     main = "Daily Max Temperature (Interior Sensors)",
     xlab = "",
     ylab = "Temperature (C)")
lines(daily_range$day, daily_range$`max(Sedum.acre)`, col="blue", lty = 1)
lines(daily_range$day, daily_range$`max(bare.substrate)`, col="black", lty = 1)
legend("bottom", legend = c("substrate", "rubro", "acre"), col = c("black", "red", "blue"), lty=1:1, box.lty=0)

Category <- c("Lower Max (vs Soil)", "Higher Max (vs Soil)", "Same Max (vs Soil)", "Average Max Temperature", "Maximum Max Temperature")
rubro_max <- rbind(sum((daily_range$`max(Sedum.rubro)` - daily_range$`max(bare.substrate)`) < 0), 
                     sum((daily_range$`max(Sedum.rubro)` - daily_range$`max(bare.substrate)`) > 0), 
                     sum((daily_range$`max(Sedum.rubro)` - daily_range$`max(bare.substrate)`) == 0),
                     mean(daily_range$`max(Sedum.rubro)`),
                     max(daily_range$`max(Sedum.rubro)`))

acre_max <- rbind(sum((daily_range$`max(Sedum.acre)` - daily_range$`max(bare.substrate)`) < 0), 
                     sum((daily_range$`max(Sedum.acre)` - daily_range$`max(bare.substrate)`) > 0), 
                     sum((daily_range$`max(Sedum.acre)` - daily_range$`max(bare.substrate)`) == 0),
                     mean(daily_range$`max(Sedum.acre)`),
                     max(daily_range$`max(Sedum.acre)`))

Max_counts <- cbind.data.frame(Category, rubro_max, acre_max)
knitr::kable(Max_counts, caption = "Table: Summary of Maximum Temperature by Treatment")
# Linear Models for Treatment vs Control

ggplot(treat_avg, aes(x=bare.substrate, y=Sedum.rubro)) + 
  geom_point()+
  geom_smooth(method = "lm")+
  ylim(7.5,39)+xlim(7.5,39)+
  ylab("sedum rubro")+
  xlab("bare substrate")+
  ggtitle("Linear Model of soil ~ Sedum rubrotinctum")

linearMod1 <- lm(bare.substrate ~ Sedum.rubro , data=treat_avg) %>%
  summary()%>%
  broom::tidy()

knitr::kable(linearMod1, caption = "Linear Model Summary Statistics: soil ~ Sedum rubrotinctum")
ggplot(treat_avg) + theme_void()
  
ggplot(treat_avg, aes(x=bare.substrate, y=Sedum.acre)) + 
  geom_point()+
  geom_smooth(method = "lm")+
  ylim(7.5,39)+xlim(7.5,39)+
  ylab("sedum acre")+
  xlab("bare substrate")+
  ggtitle("Linear Model of soil ~ Sedum acre")

linearMod2 <- lm(bare.substrate ~ Sedum.acre , data=treat_avg) %>%
  summary()%>%
  broom::tidy()

knitr::kable(linearMod2, caption = "Linear Model Summary Statistics: soil ~ Sedum acre")
ggplot(treat_avg) + theme_void()
ggplot(treat_avg, aes(x=bare.substrate, y=rubro.vs.substrate)) + 
  geom_point()+
  geom_smooth()+
  ylab("sedum rubro. - bare substrate")+
  xlab("bare substrate")+
  ggtitle("Loess regression of soil ~ (Sedum rubrotinctum - soil)")

linearMod3 <- lm(bare.substrate ~ rubro.vs.substrate, data=treat_avg) %>%
  summary() %>%
  broom::tidy()

knitr::kable(linearMod3, caption = "Linear Model Summary Statistics")
ggplot(treat_avg) + theme_void()

ggplot(treat_avg, aes(x=bare.substrate, y=acre.vs.substrate)) + 
  geom_point()+
  geom_smooth()+
  ylab("sedum acre - bare substrate")+
  xlab("bare substrate")+
  ggtitle("Loess regression of soil ~ (Sedum acre - soil)")

linearMod4 <- lm(bare.substrate ~ acre.vs.substrate, data=treat_avg) %>%
  summary() %>%
  broom::tidy()
knitr::kable(linearMod4, caption = "Linear Model Summary Statistics")
  
# When Ambient > 25 degrees C (Interior T)

high_t <- 
  all_cells %>%
  filter(Ambient > 25) %>%
  filter(Location == "interior")

sum_hiT <- 
  dplyr::group_by(high_t, Treatment) %>%
  dplyr::summarize(
    count = n(),
    max = max(Temp),
    min = min(Temp),
    range = (max(Temp) - min(Temp)),
    mean = mean(Temp, na.rm = TRUE),
    median = median(Temp, na.rm = TRUE),
    sd = sd(Temp, na.rm = TRUE)
  )

ggboxplot(high_t, x = "Treatment", y = "Temp", 
          color = "Treatment", palette = c("#00AFBB", "#E7B800", "#FC4E07"),
          order = c("sedum rubrotinctum", "sedum acre", "bare substrate"),
          ylab = "Temperature",
          xlab = FALSE,
          main = "Interior Sensor Temperature when Ambient is Above 25 C",
          legend = "",
          label.rectangle = TRUE)

knitr::kable(sum_hiT, caption = "Table: Summary of High (>25) Ambient Temperatures")
# Normality Tests 

ggdensity(treat_avg$Sedum.rubro, 
          main = "Density plot of Sedum rubrotinctum Temperature",
          xlab = "Sample")

ggqqplot(treat_avg$Sedum.rubro)

shapiro.test(treat_avg$Sedum.rubro)


ggdensity(treat_avg$Sedum.acre, 
          main = "Density plot of Sedum acre Temperature",
          xlab = "Sample")

ggqqplot(treat_avg$Sedum.acre)

shapiro.test(treat_avg$Sedum.acre)
#Sedum rubrotinctum Transformations

rubro <- treat_avg$Sedum.rubro

par(mfrow=c(2,3))

#1. No Transformation
plotNormalHistogram(rubro, main = "No Transformation")

#2. Square Root Transformation
T_sqrt = sqrt(rubro)
plotNormalHistogram(T_sqrt, main = "Square Root")

#3. Cube Root Transformation 
T_cub = sign(rubro) * abs(rubro)^(1/3) 
plotNormalHistogram(T_cub, main = "Cube Root")

#4. Log Transformation
T_log = log(rubro)
plotNormalHistogram(T_log, main = "Log")

#5. Tukey's Ladder of Powers Transformation
T_tuk <- transformTukey(rubro, plotit=FALSE, quiet = TRUE)
plotNormalHistogram(T_tuk, main = "Tukey's Ladder of Powers")

#6. Box-Cox Transformation
invisible(powerTransform(rubro))
lambda <- -0.2877828                 
T_box <- (rubro ^ lambda - 1)/lambda 
plotNormalHistogram(T_box, main = "Box-Cox")

skews <- c(signif(skewness(rubro), digits = 3), 
           signif(skewness(T_sqrt), digits = 3),
           signif(skewness(T_cub), digits = 3), 
           signif(skewness(T_log), digits = 3),
           signif(skewness(T_tuk), digits = 3),
           signif(skewness(T_box), digits = 3)) 

kurtos <- c(signif(kurtosis(rubro), digits = 3), 
           signif(kurtosis(T_sqrt), digits = 3),
           signif(kurtosis(T_cub), digits = 3), 
           signif(kurtosis(T_log), digits = 3),
           signif(kurtosis(T_tuk), digits = 3),
           signif(kurtosis(T_box), digits = 3)) 
           
names <- c("No Transformation", "Square Root", "Cube Root", "Log", "Tukey's Ladder of Powers", "Box-Cox")

distList <- cbind.data.frame(names, skews, kurtos)
colnames(distList) <- c("Transformation Type", "Skewness", "Kurtosis")

knitr::kable(distList, caption = "Table: Skewness + Kurtosis")

ggplot(treat_avg) + theme_void()
#Sedum acre Transformations

acre <- treat_avg$Sedum.acre

par(mfrow=c(2,3))

#1. No Transformation
plotNormalHistogram(acre, main = "No Transformation")

#2. Square Root Transformation
T_sqrt = sqrt(acre)
plotNormalHistogram(T_sqrt, main = "Square Root")

#3. Cube Root Transformation 
T_cub = sign(rubro) * abs(acre)^(1/3) 
plotNormalHistogram(T_cub, main = "Cube Root")

#4. Log Transformation
T_log = log(acre)
plotNormalHistogram(T_log, main = "Log")

#5. Tukey's Ladder of Powers Transformation
T_tuk <- transformTukey(acre, plotit=FALSE, quiet = TRUE)
plotNormalHistogram(T_tuk, main = "Tukey's Ladder of Powers")

#6. Box-Cox Transformation
invisible(powerTransform(acre))
lambda <- -0.2877828                 
T_box <- (acre ^ lambda - 1)/lambda 
plotNormalHistogram(T_box, main = "Box-Cox")

skews <- c(signif(skewness(acre), digits = 3), 
           signif(skewness(T_sqrt), digits = 3),
           signif(skewness(T_cub), digits = 3), 
           signif(skewness(T_log), digits = 3),
           signif(skewness(T_tuk), digits = 3),
           signif(skewness(T_box), digits = 3)) 

kurtos <- c(signif(kurtosis(acre), digits = 3), 
           signif(kurtosis(T_sqrt), digits = 3),
           signif(kurtosis(T_cub), digits = 3), 
           signif(kurtosis(T_log), digits = 3),
           signif(kurtosis(T_tuk), digits = 3),
           signif(kurtosis(T_box), digits = 3)) 
           
names <- c("No Transformation", "Square Root", "Cube Root", "Log", "Tukey's Ladder of Powers", "Box-Cox")

distList <- cbind.data.frame(names, skews, kurtos)
colnames(distList) <- c("Transformation Type", "Skewness", "Kurtosis")

knitr::kable(distList, caption = "Table: Skewness + Kurtosis")

# Appendix - Code